﻿
namespace SistemaLogistica.DataAccess
{
    using System.Collections.Generic;
    using System.Data;
    using System.Data.Common;
    using SistemaLogistica.Business.Entities;

    public class ProveedorData : BaseDataAccess
    {
        private ProveedorData() { }

        private readonly static ProveedorData instancia = new ProveedorData();

        public static ProveedorData Instancia
        {
            get { return instancia; }
        }

        public List<Proveedor> Listar()
        {
            List<Proveedor> proveedores = new List<Proveedor>();
            DbCommand command = db.GetStoredProcCommand("GetAllFromProveedor");
            using (IDataReader dr = db.ExecuteReader(command))
            {
                while (dr.Read())
                {
                    proveedores.Add(new Proveedor
                    {
                        IdProveedor = dr.GetInt32(dr.GetOrdinal("IdProveedor")),
                        RazonSocial = dr.GetString(dr.GetOrdinal("RazonSocial")),
                        Contacto = dr.GetString(dr.GetOrdinal("Contacto")),
                        Direccion = dr.GetString(dr.GetOrdinal("Direccion")),
                        Email = dr.GetString(dr.GetOrdinal("Email")),
                        Ruc = dr.GetString(dr.GetOrdinal("Ruc")),
                        Telefono = dr.GetString(dr.GetOrdinal("Telefono")),
                        TipoProveedor = dr.GetInt32(dr.GetOrdinal("TipoProveedor"))
                    });
                }
            }
            return proveedores;
        }

        public List<Proveedor> Buscar(string nombre)
        {
            List<Proveedor> proveedores = new List<Proveedor>();
            DbCommand command = db.GetStoredProcCommand("GetProveedorByKeyWord");
            db.AddInParameter(command, "nombre", DbType.String, nombre);
            using (IDataReader dr = db.ExecuteReader(command))
            {
                while (dr.Read())
                {
                    proveedores.Add(new Proveedor
                    {
                        IdProveedor = dr.GetInt32(dr.GetOrdinal("IdProveedor")),
                        RazonSocial = dr.GetString(dr.GetOrdinal("RazonSocial")),
                        Contacto = dr.GetString(dr.GetOrdinal("Contacto")),
                        Direccion = dr.GetString(dr.GetOrdinal("Direccion")),
                        Email = dr.GetString(dr.GetOrdinal("Email")),
                        Ruc = dr.GetString(dr.GetOrdinal("Ruc")),
                        Telefono = dr.GetString(dr.GetOrdinal("Telefono")),
                        TipoProveedor = dr.GetInt32(dr.GetOrdinal("TipoProveedor"))
                    });
                }
            }
            return proveedores;
        }

        public Proveedor ObtenerPorID(int proveedorID)
        {
            Proveedor proveedor = null;
            DbCommand command = db.GetStoredProcCommand("GetProveedorByIdProveedor");
            db.AddInParameter(command, "idProveedor", DbType.Int32, proveedorID);
            using (IDataReader dr = db.ExecuteReader(command))
            {
                if (dr.Read())
                {
                    proveedor = new Proveedor
                    {
                        IdProveedor = dr.GetInt32(dr.GetOrdinal("IdProveedor")),
                        RazonSocial = dr.GetString(dr.GetOrdinal("RazonSocial")),
                        Contacto = dr.GetString(dr.GetOrdinal("Contacto")),
                        Direccion = dr.GetString(dr.GetOrdinal("Direccion")),
                        Email = dr.GetString(dr.GetOrdinal("Email")),
                        Ruc = dr.GetString(dr.GetOrdinal("Ruc")),
                        Telefono = dr.GetString(dr.GetOrdinal("Telefono")),
                        TipoProveedor = dr.GetInt32(dr.GetOrdinal("TipoProveedor"))
                    };
                }
            }
            return proveedor;
        }

        public Proveedor ObtenerPorRUC(string ruc)
        {
            Proveedor proveedor = null;
            DbCommand command = db.GetStoredProcCommand("GetProveedorByRUC");
            db.AddInParameter(command, "ruc", DbType.String, ruc);
            using (IDataReader dr = db.ExecuteReader(command))
            {
                if (dr.Read())
                {
                    proveedor = new Proveedor
                    {
                        IdProveedor = dr.GetInt32(dr.GetOrdinal("IdProveedor")),
                        RazonSocial = dr.GetString(dr.GetOrdinal("RazonSocial")),
                        Contacto = dr.GetString(dr.GetOrdinal("Contacto")),
                        Direccion = dr.GetString(dr.GetOrdinal("Direccion")),
                        Email = dr.GetString(dr.GetOrdinal("Email")),
                        Ruc = dr.GetString(dr.GetOrdinal("Ruc")),
                        Telefono = dr.GetString(dr.GetOrdinal("Telefono")),
                        TipoProveedor = dr.GetInt32(dr.GetOrdinal("TipoProveedor"))
                    };
                }
            }
            return proveedor;
        }

        public int Agregar(Proveedor proveedor)
        {
            DbCommand command = db.GetStoredProcCommand("InsertProveedor");
            db.AddInParameter(command, "Contacto", DbType.String, proveedor.Contacto);
            db.AddInParameter(command, "Direccion", DbType.String, proveedor.Direccion);
            db.AddInParameter(command, "Email", DbType.String, proveedor.Email);
            db.AddInParameter(command, "RazonSocial", DbType.String, proveedor.RazonSocial);
            db.AddInParameter(command, "Ruc", DbType.String, proveedor.Ruc);
            db.AddOutParameter(command, "idProveedor", DbType.Int32, 11);
            db.AddInParameter(command, "Telefono", DbType.String, proveedor.Telefono);
            db.AddInParameter(command, "TipoProveedor", DbType.Int32, proveedor.TipoProveedor);

            int result = db.ExecuteNonQuery(command);

            if (result != 0) return 1;
            else return 0;
        }

        public void Modificar(Proveedor proveedor)
        {
            DbCommand command = db.GetStoredProcCommand("UpdateProveedor");
            db.AddInParameter(command, "Contacto", DbType.String, proveedor.Contacto);
            db.AddInParameter(command, "Direccion", DbType.String, proveedor.Direccion);
            db.AddInParameter(command, "Email", DbType.String, proveedor.Email);
            db.AddInParameter(command, "RazonSocial", DbType.String, proveedor.RazonSocial);
            db.AddInParameter(command, "Ruc", DbType.String, proveedor.Ruc);
            db.AddInParameter(command, "idProveedor", DbType.Int32, proveedor.IdProveedor);
            db.AddInParameter(command, "Telefono", DbType.String, proveedor.Telefono);
            db.AddInParameter(command, "TipoProveedor", DbType.Int32, proveedor.TipoProveedor);
            int result = db.ExecuteNonQuery(command);
        }

        public void Eliminar(int idProveedor)
        {
            DbCommand command = db.GetStoredProcCommand("DeleteProveedor");
            db.AddInParameter(command, "idProveedor", DbType.Int16, idProveedor);
            db.ExecuteNonQuery(command);
        }
    }
}
